const koa = require('koa')
const path = require('path')
// const views = require('koa-views')
const static = require('koa-static')
const bodyParser = require('koa-bodyparser')
const session = require('koa-session')
const render = require('koa-art-template')
const morgan = require('koa-morgan')
const jwt = require('koa-jwt')
const auth = require('./utils/auth')
const router = require('./routers/index')
const sessionConfig = require('./config/session-config')

const app = new koa()

// 配置art-template模板引擎
render(app, {
  root: path.join(__dirname, 'views'),
  extname: '.html',
  debug: process.env.NODE_ENV !== 'production'
})
// 配置ejs模板引擎
// app.use(views(__dirname + '/views', { extension: 'ejs' }))

//设置session 签名, 如果sessionConfig中的signed为true需要设置
// app.keys = ['username']
//配置session
app.use(session(sessionConfig, app))

// 配置cors 可以使用koa2-cors
// let whiteList = ['http://localhost:3000']
app.use(async (ctx, next) => {
  //允许来自所有域名请求
  ctx.set('Access-Control-Allow-Origin', '*')
  // 这样就能只允许 http://localhost:3000 这个域名的请求了
  // ctx.set("Access-Control-Allow-Origin", "http://localhost:3000");

  //字段是必需的。它也是一个逗号分隔的字符串，表明服务器支持的所有头信息字段.
  ctx.set('Access-Control-Allow-Headers', 'content-type')

  /**
   * 该字段可选，用来指定本次预检请求的有效期，单位为秒
   * 当请求方法是PUT或DELETE等特殊方法或者Content-Type字段的类型是application/json时，服务器会提前发送一次请求进行验证
   * 下面的的设置只本次验证的有效时间，即在该时间段内服务端可以不用进行验证
   * 如果值为 -1，则表示禁用缓存，每一次请求都需要提供预检请求，即用OPTIONS请求进行检测
   */
  ctx.set('Access-Control-Max-Age', 300)

  // ctx.set("Content-Type", "application/json;charset=utf-8")

  if (ctx.method === 'OPTIONS') {
    ctx.body = 'OPTIONS'
  }
  await next()
})

app.use(async (ctx, next) => {
  return next().catch(err => {
    if (401 === err.status) {
      ctx.status = 401
      ctx.body = {
        code: 401,
        msg: '认证失败',
        success: true
      }
    } else {
      throw err
    }
  })
})

//jwt
app.use(
  jwt({
    secret: 'secret',
    isRevoked: auth.verify
  }).unless({
    path: ['/login', '/news', /^\/images/, /^\/css/]
  })
)

// 请求日志中间件
app.use(morgan(':method :url :status :response-time ms'))

// 应用级中间件（自定义）
// app.use(async (ctx, next) => {
// 	console.log(new Date(), ctx.url)
// 	await next()
// 	if (ctx.status === 404) {
// 		ctx.body = '我是404页面'
// 	}
// })

app.use(static(__dirname + '/static'))
app.use(bodyParser())

app.use(router.routes())
app.use(router.allowedMethods())

app.listen('8899', function() {
  console.log('服务已经启动,监听8899端口')
})
